﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PiControls.Controls.Scrollbar
{
    public partial class PiScrollbar : UserControl
    {
        public PiScrollbar()
        {
            InitializeComponent();
        }
        private bool wheel_move = false;
        [Description("标识滚轮是否发生了运动")]
        public bool Wheel_move
        {
            get { return wheel_move; }
            set { wheel_move = value; }
        }

        private string moveway = null;
        [Description("标识滚轮的滚动方向")]
        public string Moveway
        {
            get { return moveway; }
            set { moveway = value; }
        }
        private int winH = 0;                                   //定义一个 滚动条的属性 用于接收 窗口的高度
        [Description("需要滚动条控件的高度")]
        public int WinH
        {
            get { return winH; }
            set { winH = value; }
        }

        private Panel con = null;
        //用于接收 需要滚动条的控件
        [Description("需要滚动条的控件")]
        public Panel control
        {
            get { return con; }
            set
            {
                con = value;
            }
        }

        private bool control_move = false;                                   //用于标识 需要滚动条控件的主动移动  此时需要移动滑块到相应的位置
        [Description("标识是否通过其他途径改变了控件的位置")]
        public bool Control_move
        {
            get { return control_move; }
            set { control_move = value; }
        }

        private static bool IsMove = false;                 //标识 鼠标在滑块上的运动状态 初始为false
        private int Y;                                          //定义一个变量 用于记录鼠标进入滑块中并按下时的位置
        private int baY = 0;                            //得到滑块的初始位置
        private int baY1 = -30000;                       //定义一个变量 用于记录 需要滚动条控件 的相对于窗口的 初始位置y坐标
        private int panH;                                   //用于记录 需要滚动条的控件的高度
        private void UserControl1_Load(object sender, EventArgs e)
        {
            panel1.BackColor = Color.FromArgb(178, 198, 187);           //设置滑块的初始颜色
            this.BackColor = Color.White;                                       //设置滑条的背景颜色
            panel1.Top = 0;                                                 //设置滑块相对于滑条的初始位置
        }
        private void panel1_MouseDown(object sender, MouseEventArgs e)          //鼠标对滑块的按下事件 
        {
            IsMove = true;                                               //当按下时候 标识 鼠标开始移动  
            Y = e.Location.Y;                                              //获取鼠标 的初始位置的y坐标
            panel1.BackColor = Color.FromArgb(10, 204, 61);         //滑块颜色变为深一点的绿色
        }

        int lastY = 0;
        private void panel1_MouseMove(object sender, MouseEventArgs e)      //鼠标对滑块的 移动 事件
        {

            if (IsMove == true)                             //如果鼠标开始移动
            {
                if (panel1.Bottom >= this.Height)
                {

                    if ((e.Location.Y - Y) < 0)                     //如果 鼠标向上滑动  
                    {
                        panel1.Top += e.Location.Y - Y;         //将滑块的位置增加  增加的量是鼠标移动的距离
                    }
                    else                                                //如果鼠标向下移动
                    {
                        panel1.Top = this.Height - panel1.Height;         //滑块的位置始终为 滑条最底部的位置

                    }


                }
                else if (panel1.Top <= 0)
                {

                    if ((e.Location.Y - Y) > 0)
                    {

                        panel1.Top += e.Location.Y - Y;
                    }
                    else
                    {
                        panel1.Top = 0;

                    }

                }
                else
                {
                    scrollbar_Move_click();
                    panel1.Top += e.Location.Y - Y;
                }


            }

        }

        private void panel1_MouseUp(object sender, MouseEventArgs e)            //当鼠标松开时候 意味着 用户 不再需要滑动滑块
        {
            IsMove = false;                             //此时将标识变为false
            panel1.BackColor = Scrollbar_MouseUp;       //鼠标按下
        }

        private void panel1_MouseEnter(object sender, EventArgs e)
        {
            panel1.BackColor = Scrollbar_MouseEnter;  //鼠标悬停滑块颜色
        }

        private void panel1_MouseLeave(object sender, EventArgs e)
        {
            panel1.BackColor = Scrollbar_MouseLeave;    //鼠标离开滑块颜色
        }

        private void blog_scrollbar_Load(object sender, EventArgs e)
        {
            panel1.BackColor = Scrollbar_MouseLeave;                  //设置滑块的初始颜色
            this.BackColor = Color.White;                                       //设置滑条的背景颜色
            panel1.Top = 0;
        }

        private void scrollbar_Move_click() {

       
            double bfb = CalculatePercentage(panel1.Bottom, 80, this.Height);
            int maxScrollY = control.DisplayRectangle.Height - control.ClientSize.Height; // 最大滚动值
            control.VerticalScroll.Value = CalculateValue(bfb, maxScrollY);

        }

        // 计算 A 对应的百分比
        // 计算 A 对应的百分比（从 A_min 开始）
      private  double CalculatePercentage(int value, int min, int max)
        {
            double percentage = ((value - min) / (double)(max - min)) * 100;
            if (percentage < 0)
            {
               return 0;
            }
            return percentage;
        }

        private int CalculateValue(double percentage, int max)
        {
            int value = (int)(percentage / 100 * max);

            if (value < -1)
            {
                return 0;
            }
               return value;
        }

        private Color Scrollbar_MouseUp = Color.FromArgb(255, 50, 50); //鼠标按下颜色
        private Color Scrollbar_MouseEnter = Color.FromArgb(255, 100, 100); //鼠标悬停颜色
        private Color Scrollbar_MouseLeave = Color.FromArgb(0, 255, 255); //鼠标离开颜色  //默认

        //panel1_MouseEnter


        public void SetscrollbarMouseUp(Color color)  //鼠标按下颜色
        {  //鼠标按下颜色

            Scrollbar_MouseUp = color;

        }

        public void SetscrollbarMouseEnter(Color color)
        {  //鼠标悬停颜色

            Scrollbar_MouseEnter = color;

        }

        public void SetscrollbarMouseLeave(Color color)
        { //鼠标离开颜色

            Scrollbar_MouseLeave = color;
            panel1.BackColor = Scrollbar_MouseLeave;                  //设置滑块的初始颜色
            this.BackColor = Color.White;

        }




    }
}


